#version 120

#define highp
#define mediump
#define lowp

// Interpolated values from vertex shaders
varying vec2 UV;
varying vec3 Position_worldspace;
varying vec3 Normal_cameraspace;
varying vec3 EyeDirection_cameraspace;
varying vec3 LightDirection_cameraspace;

// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;
uniform mat4 MV;
uniform vec3 LightPosition_worldspace;

void main(void)
{
    // Light emission properties
    // You probably want to put them as uniforms
    vec3 LightColor = vec3(1,1,1);
    float LightPower = 50.0f;

    // Material properites
    vec3 MaterialDiffuseColor = texture2D(myTextureSampler, UV).rgb;
    vec3 MaterialAmbiantColor = vec3(0.1, 0.1, 0.1) * MaterialDiffuseColor;
    vec3 MaterialSpecularColor = vec3(0.3, 0.3, 0.3);

    // Distance to the light
    float distance = length( LightPosition_worldspace - Position_worldspace);

    // NOrmal of the computed fragement, in camera space
    vec3 n = normalize(Normal_cameraspace);
    // Direction of the light (from the fragment to the light)
    vec3 l = normalize(LightDirection_cameraspace);

    // Cosine of the angle between the normal and the light direction,
    // clamped above 0
    // -light is at the vertical of the triangel -> 1
    // -light is perpendicular to the triangle -> 0
    // -light is behind the triangle -> 0
    float cosTheta = clamp( dot(n,l), 0, 1);

    // Eye vector (towards the camera)
    vec3 E = normalize(EyeDirection_cameraspace);
    // direction in which the trianlge reflects the light.
    vec3 R = reflect(-l, n);
    // Cosine of the angle between the Eye vector and the Reflect vector,
    // clamped to 0
    // - Looking into the reflectio -> 1
    // - Looking elsewhere -> < 1
    float cosAlpha = clamp( dot(E,R), 0, 1);

    gl_FragColor.rgb =
            // Ambiant : simulates indirect lighting
            MaterialAmbiantColor +
            // Diffuse: "color" of the object
            MaterialDiffuseColor * LightColor * LightPower * cosTheta / (distance*distance) +
            // Specular : reflective hightlight, like a mirror
            MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha, 5) / (distance*distance);

//    gl_FragColor = texture2D(myTextureSampler, UV);
}
